package com.langchain4j.core.llm.factory;

import com.langchain4j.core.llm.provider.LLMProvider;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * LLM提供者工厂
 */
@Slf4j
@Component
public class LLMProviderFactory {
    
    private final Map<String, LLMProvider> providers = new ConcurrentHashMap<>();
    
    @Autowired
    public LLMProviderFactory(List<LLMProvider> providerList) {
        for (LLMProvider provider : providerList) {
            String providerType = provider.getProviderType();
            providers.put(providerType, provider);
            log.info("Registered LLM provider: {}", providerType);
        }
    }
    
    /**
     * 根据提供者类型获取提供者
     * @param providerType 提供者类型
     * @return LLM提供者
     */
    public LLMProvider getProvider(String providerType) {
        LLMProvider provider = providers.get(providerType);
        if (provider == null) {
            throw new IllegalArgumentException("Unsupported provider type: " + providerType);
        }
        return provider;
    }
    
    /**
     * 获取所有可用的提供者类型
     * @return 提供者类型列表
     */
    public List<String> getAvailableProviders() {
        return List.copyOf(providers.keySet());
    }
    
    /**
     * 检查提供者是否可用
     * @param providerType 提供者类型
     * @return 是否可用
     */
    public boolean isProviderAvailable(String providerType) {
        return providers.containsKey(providerType);
    }
    
    /**
     * 获取默认提供者
     * @return 默认LLM提供者
     */
    public LLMProvider getDefaultProvider() {
        // 优先返回OpenAI，如果没有则返回第一个可用的
        if (providers.containsKey("openai")) {
            return providers.get("openai");
        }
        
        if (!providers.isEmpty()) {
            return providers.values().iterator().next();
        }
        
        throw new IllegalStateException("No LLM provider available");
    }
    
    /**
     * 获取所有提供者
     * @return 所有提供者的Map
     */
    public Map<String, LLMProvider> getAllProviders() {
        return Map.copyOf(providers);
    }
} 